package myStack;

// 模拟实现Stack的功能
// 为什么是使用数组进行操作：因为Stack的底层是数组，所以操作就在数组上进行！！！

import java.util.Arrays;

public class MyStack {
    // 新建数组、以及默认大小 + 有效大小
    public int[] array;
    public static int DEFAULT_SIZE = 3;
    public int usedSize;

    // 使用构造方法进行数组初始化
    public MyStack() {
        //int[] array = new int[DEFAULT_SIZE];
        // 其实是进行初始化（以数组名来初始化）
        array = new int[DEFAULT_SIZE];
    }


    // 判满
    public boolean isFull() {
        return (getSize()==DEFAULT_SIZE);
    }

    // 扩容
    public void ensureCapacity() {
        if(isFull()) { // man了就进行扩容
            System.out.println("进行扩容：");
            //Arrays.copyOf(array,2*DEFAULT_SIZE); // 注意这里扩容后要赋值给数组！！
            array = Arrays.copyOf(array,2*DEFAULT_SIZE);
        }
        // 这里就是说明未满不需要扩容或者已经扩容成功
        return ;
    }

    // push压栈:元素入栈
    public int push(int e) {
        // 进行判满+扩容
        ensureCapacity();
        // 进行数据元素的存储：数组存储--下标利用usedSize
        /*array[usedSize] = e;
        usedSize++;*/
        // 注意以上两行可以合并成一行：先用后加：即后置++操作
        array[usedSize++] = e;
        return e;
    }

    // pop出栈:拿到栈顶元素+删除
    public int pop() {
        /*// 判空
        if(isEmpty()) {
            throw new EmptyException("sorry 栈为空，无法获取栈顶元素！");
        }
        // 先进行-- 再进行使用
        return (array[--usedSize]);*/

        // 或者使用peek，省去判空
        int tmp = peek();
        usedSize--;
        return tmp;

    }

    // peek拿到栈顶元素但不删除
    public int peek() {
        // 首先要进行判空操作
        if(isEmpty()) {
            throw new EmptyException("sorry 栈为空，无法获取栈顶元素！");
        }
        return (array[usedSize-1]);
    }

    // 拿到实际有效长度
    public int getSize() {
        return usedSize;
    }


    // 判空
    public boolean isEmpty() {
        return (0==usedSize);
    }


}
